linux 中的seat管理

·

seat一般控制哪些设备

  • 哪些设备属于一个 seat、由谁配置/控制,是掌握 Linux 图形会话、多用户、多终端安全模型的关键

  • Seat 管理的设备主要包括:GPU(DRM/KMS)、输入设备(键盘/鼠标/触摸屏等)、声音设备(可选)和串口/智能卡读卡器(高级场景)

  • 这些设备的归属由 udev 规则标记,并由 systemd-logind 在运行时动态分配给活跃的图形会话(session)

  • 图形设备 /dev/dri/card0, /dev/dri/renderD128 GPU,用于显示输出和硬件加速

  • 输入设备 /dev/input/event* 键盘、鼠标、触摸板、触控屏、Tablet 等

  • TTY 控制台 /dev/tty0, /dev/tty1 ... 虚拟终端(VT),seat 通常绑定到一个 VT

  • 音频设备(可选) /dev/snd/* 某些系统将声卡绑定到 seat(非强制)

  • 其他外设(可选) /dev/ttyS0, /dev/usb/hiddev* 如串口、智能卡读卡器(企业/嵌入式场景)

  • ⚠️ 注意:网络设备、存储设备(如 /dev/sda)不属于 seat,它们是全局共享的。

  • 如果未设置 ID_SEAT,设备默认属于 seat0(主 seat)

  • /etc/udev/rules.d/99-seat1.rules

  • 将特定 USB 键鼠绑定到 seat1

  • SUBSYSTEM=="input", ATTRS{idVendor}=="abcd", ATTRS{idProduct}=="1234", ENV{ID_SEAT}="seat1"

  • 将特定 GPU 绑定到 seat1

  • SUBSYSTEM=="drm", KERNEL=="card1", ENV{ID_SEAT}="seat1"

# 列出所有 seats
loginctl list-seats
# 查看 seat0 的详细信息(含设备)
loginctl show-seat seat0 -p ActiveSession -p Devices

# 查看某个输入设备是否属于 seat0
udevadm info /dev/input/event4 | grep ID_SEAT
# 查看是否有 uaccess 标签
udevadm info /dev/dri/card0 | grep TAGS
# 输出应包含: :uaccess:

# 使用 loginctl 工具将一个设备永久地分配给一个特定的 Seat
loginctl attach [SEAT_ID] [DEVICE_SYSFS_PATH]
    [SEAT_ID]: 你想分配到的 Seat 名称,例如 seat1。
    [DEVICE_SYSFS_PATH]: 设备的 SysFS 路径,例如 /sys/devices/pci0000:00/.../drm/card1。

多seat控制管理

  • 假设你有一台机器,接了两套显示器+键鼠:
    • Seat0:主板 HDMI + 内置键盘 → 用户 A 登录 GNOME
    • Seat1:PCIe 独立显卡 + USB 键鼠 → 用户 B 登录 Sway
  • 你需要:
    • 创建 udev 规则,将独显和 USB 设备标记为 ID_SEAT=seat1
    • 启动两个图形会话(分别绑定到不同 TTY)
    • systemd-logind 自动为每个 session 授权对应设备
  • 此时:
    • 用户 A 无法看到用户 B 的屏幕内容;
    • 用户 B 的键盘不会影响用户 A;
    • GPU 资源完全隔离。